package models

import (
	"gorm.io/datatypes"
	"time"
)

// 结构体命名格式
// 结构体没特殊情况一律先使用大驼峰
// 表全量结构体直接使用表名称的大驼峰
// 查询条件 GET请求使用 [表名称]+[接口path简写英文]+Params
// 表单信息 POST请求使用 [表名称]+[接口path简写英文]+Body

// 帅选表查询结果  [表名称]+[接口path简写英文，多个接口组合使用And拼接]+Select
// 响应数据（Data里边的） GET、POST请求使用 [表名称]+[接口path简写英文]+Res
// 拆分通用类写入commomType文件中

// LoginRequest 登录请求结构
type LoginRequest struct {
	Username string `json:"username" binding:"required"`
	Password string `json:"password" binding:"required"`
	DeviceID string `json:"device_id"`
}

// GetVerifyUserInfoRes 用户验证信息返回结构
type GetVerifyUserInfoRes struct {
	UserID      int    `gorm:"column:userId"   json:"userId"`
	Username    string `gorm:"type:varchar(50);unique;comment:用户名" json:"username"`     // 用户名
	Password    string `gorm:"type:varchar(255);comment:密码" json:"password"`            // 密码
	PhoneNumber string `gorm:"type:varchar(20);unique;comment:手机号" json:"phone_number"` // 手机号
	Status      int    `gorm:"type:tinyint;default:1;comment:账号状态" json:"status"`       // 用户状态
}

// PUser 结构体对应数据库中的 users 表
type PUser struct {
	ID            uint      `gorm:"primaryKey;autoIncrement;comment:用户ID" json:"id"`
	Nickname      string    `gorm:"type:varchar(50);not null;comment:用户昵称" json:"nickname"`
	Avatar        string    `gorm:"type:varchar(255);default:'';comment:用户头像" json:"avatar"`
	Email         string    `gorm:"type:varchar(100);default:null;unique;comment:邮箱地址" json:"email"`
	AccountType   int       `gorm:"type:tinyint;default:0;comment:账号类型(1-普通, 2-会员, 3-测试)" json:"account_type"`
	Username      string    `gorm:"type:varchar(50);default:null;unique;comment:用户名" json:"username"`
	Password      string    `gorm:"type:varchar(255);default:null;comment:密码(加密存储)" json:"password"`
	PhoneNumber   string    `gorm:"type:varchar(20);default:null;unique;comment:手机号" json:"phone_number"`
	WechatOpenid  string    `gorm:"type:varchar(64);default:null;unique;comment:微信OpenID" json:"wechat_openid"`
	QQOpenid      string    `gorm:"type:varchar(64);default:null;unique;comment:QQ OpenID" json:"qq_openid"`
	HuaweiID      string    `gorm:"type:varchar(64);default:null;unique;comment:华为账号ID" json:"huawei_id"`
	Status        int       `gorm:"type:tinyint;default:1;comment:账号状态(1-正常, 0-禁用)" json:"status"`
	LastLoginTime time.Time `gorm:"type:datetime;comment:最后登录时间" json:"last_login_time"`
	CreateTime    time.Time `gorm:"type:datetime;default:CURRENT_TIMESTAMP;comment:创建时间" json:"create_time"`
	UpdateTime    time.Time `gorm:"type:datetime;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;comment:更新时间" json:"update_time"`
	IsDeleted     int       `gorm:"type:tinyint;default:0;comment:逻辑删除标识(1-已删除, 0-未删除)" json:"is_deleted"`
}

//*********** 登录验证 ***********

// UserWithRole 定义查询结果的结构体
type UserWithRole struct {
	UserID   int    `gorm:"column:userId"   json:"userId"`
	Username string `gorm:"column:username" json:"username"`
	Nickname string `gorm:"column:nickname" json:"nickname"`
	DeptID   int    `gorm:"column:dept_id"  json:"deptId"`
	Roles    string `gorm:"column:roles"    json:"roles"`
	Password string `gorm:"column:password" json:"password"`
	Status   int    `gorm:"column:status"   json:"status"`
}

// SysUserUsersLoginTokenUserInfo 登录：token-payload-userinfo
type SysUserUsersLoginTokenUserInfo struct {
	UserID      int    `gorm:"column:userId"   json:"userId"`
	DeviceID    string `json:"device_id"`
	Username    string `gorm:"type:varchar(50);unique;comment:用户名" json:"username"`     // 用户名
	PhoneNumber string `gorm:"type:varchar(20);unique;comment:手机号" json:"phone_number"` // 手机号
	Status      int    `gorm:"type:tinyint;default:1;comment:账号状态" json:"status"`       // 用户状态

}

//*********** 根据token获取当前登录用户信息 ***********

type SysUserUsersMeSelect struct {
	UserID        int64     `json:"userId"` // 用户ID
	Nickname      string    `gorm:"type:varchar(50);not null;comment:用户昵称" json:"nickname"`
	Avatar        string    `gorm:"type:varchar(255);default:'';comment:用户头像" json:"avatar"`
	Email         string    `gorm:"type:varchar(100);default:null;unique;comment:邮箱地址" json:"email"`
	AccountType   int       `gorm:"type:tinyint;default:0;comment:账号类型(1-普通, 2-会员, 3-测试)" json:"account_type"`
	Username      string    `gorm:"type:varchar(50);default:null;unique;comment:用户名" json:"username"`
	PhoneNumber   string    `gorm:"type:varchar(20);default:null;unique;comment:手机号" json:"phone_number"`
	WechatOpenid  string    `gorm:"type:varchar(64);default:null;unique;comment:微信OpenID" json:"wechat_openid"`
	QQOpenid      string    `gorm:"type:varchar(64);default:null;unique;comment:QQ OpenID" json:"qq_openid"`
	HuaweiID      string    `gorm:"type:varchar(64);default:null;unique;comment:华为账号ID" json:"huawei_id"`
	Status        int       `gorm:"type:tinyint;default:1;comment:账号状态(1-正常, 0-禁用)" json:"status"`
	LastLoginTime time.Time `gorm:"type:datetime;comment:最后登录时间" json:"last_login_time"`
}

//*********** 收藏资源 ***********

type UserCollectParams struct {
	// 是否收藏
	IsCollect bool `json:"isCollect,omitempty"`
	// 资源id
	ResourceID int64 `json:"resourceId,omitempty"`
	// 用户id
	UserID int64 `json:"userId,omitempty"`
}

type UserCollect struct {
	ID         int64     `gorm:"primaryKey;autoIncrement" json:"id"`
	UserID     int64     `gorm:"not null" json:"userId"`
	ResourceID int64     `gorm:"not null" json:"resourceId"`
	CreateTime time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"createTime"`
	IsDeleted  bool      `gorm:"not null;default:0" json:"-"`
}

func (UserCollect) TableName() string {
	return "user_collect"
}

//*********** 收藏专题 ***********

type UserTopicParams struct {
	// 是否收藏
	IsCollect bool `json:"isCollect,omitempty"`
	// 资源id
	TopicID int64 `json:"topicId,omitempty"`
	// 用户id
	UserID int64 `json:"userId,omitempty"`
}

type UserTopic struct {
	ID         int64     `gorm:"primaryKey;autoIncrement" json:"id"`
	UserID     int64     `gorm:"not null" json:"userId"`
	TopicID    int64     `gorm:"not null" json:"topicId"`
	CreateTime time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"createTime"`
	IsDeleted  bool      `gorm:"not null;default:0" json:"-"`
}

func (UserTopic) TableName() string {
	return "user_topic"
}

//*********** 点赞 ***********

// LikeTargetType 点赞目标类型枚举
type LikeTargetType int8

const (
	LikeTargetResource LikeTargetType = 1 // 资源
	LikeTargetTopic    LikeTargetType = 2 // 专题
)

func (t LikeTargetType) IsValid() bool {
	return t == LikeTargetResource || t == LikeTargetTopic
}

// UserLike 用户点赞记录
type UserLike struct {
	ID         int64          `gorm:"primaryKey;autoIncrement" json:"id"`
	UserID     int64          `gorm:"not null" json:"userId"`
	TargetID   int64          `gorm:"not null" json:"targetId"`
	TargetType LikeTargetType `gorm:"not null" json:"targetType"`
	CreateTime time.Time      `gorm:"default:CURRENT_TIMESTAMP" json:"createTime"`
	IsDeleted  bool           `gorm:"not null;default:0" json:"-"`
}

func (UserLike) TableName() string {
	return "user_like"
}

type UserLikeRequestParam struct {
	// true点赞 false取消点赞
	IsLike bool `json:"isLike"`
	// 点赞目标ID（资源ID或专题ID）
	TargetID int64 `json:"targetId"`
	// 目标类型(1-资源 2-专题)
	TargetType LikeTargetType `json:"targetType"`
	// 用户
	UserID int64 `json:"userId"`
}

//*********** 用户收藏专题列表 ***********

type UserCollectTopicRequestParam struct {
	// 专题分类id 多个使用逗号分割
	CategoryID string `json:"categoryId,omitempty" form:"categoryId"`
	// 专题内容类型
	ContentType string `json:"contentType" form:"contentType"`
	// 用户id
	UserID int64 `json:"userId,omitempty" form:"userId"`
}

type UserTopicRes struct {
	ID               int64          `gorm:"primaryKey;autoIncrement" json:"id"`
	Title            string         `gorm:"size:255;not null" json:"title"`
	CoverImage       string         `gorm:"size:512;default:''" json:"coverImage"`
	CardCoverImage   string         `gorm:"size:512;default:''" json:"cardCoverImage"`
	BannerCoverImage string         `gorm:"size:512;default:''" json:"bannerCoverImage"`
	Introduction     string         `gorm:"type:text" json:"introduction"`
	WebURL           string         `gorm:"size:512" json:"webUrl"`
	CategoryID       int64          `json:"categoryId"`
	CategoryName     string         `json:"categoryName"`
	Tags             datatypes.JSON `gorm:"type:json" json:"tags"`
	ContentType      int8           `json:"contentType"`
	Location         int8           `json:"location"`
	SortOrder        int16          `gorm:"default:0" json:"sortOrder"`
	Status           int8           `gorm:"default:0" json:"status"`
	StartTime        time.Time      `json:"startTime"`
	EndTime          time.Time      `json:"endTime"`
	ResourceCount    uint           `gorm:"default:0" json:"resourceCount"`
	ViewCount        uint           `gorm:"default:0" json:"viewCount"`
	LikeCount        uint           `gorm:"default:0" json:"likeCount"`
	CollectCount     uint           `gorm:"default:0" json:"collectCount"`
	ReleaseDate      time.Time      `json:"releaseDate"`
	CreateBy         int64          `json:"createBy"`
	CreateTime       time.Time      `json:"createTime"`
	UpdateBy         int64          `json:"updateBy"`
	UpdateTime       time.Time      `json:"updateTime"`
	IsDeleted        int8           `gorm:"default:0" json:"isDeleted"`
}

// UserTopicResList  用户专辑列表返回数据结构体
type UserTopicResList struct {
	List        []UserTopicRes `json:"list"`
	Total       int64          `json:"total"`
	PageNum     int            `json:"pageNum"`
	PageSize    int            `json:"pageSize"`
	HasNextPage bool           `json:"hasNextPage"`
}

// UserResourcePageByCateParams 分页获取用户收藏指定分类资源数据 - 检索查询数据条件
type UserResourcePageByCateParams struct {
	CategoryID   string `form:"categoryId"`    // 所属分类ID，传多值，用英文逗号隔开
	ResourceType string `form:"resource_type"` // 资源类型：图文1,音频2,长视频3,短视频4
	Keyword      string `form:"keyword"`       // 标题检索关键词
	IsSubCate    bool   `form:"isSubCate"`     // 是否检索子集分类
	UserID       string `form:"userId"`        // 用户id

}

// UserResourceRes 返回用户收藏资源数据结构体
type UserResourceRes struct {
	ID               uint   `gorm:"column:id" json:"id"`
	Title            string `gorm:"column:title" json:"title"`
	CoverImage       string `json:"cover_image"`
	CardCoverImage   string `json:"card_cover_mage"`
	BannerCoverImage string `json:"banner_cover_image"`

	ResourceType     uint           `json:"resource_type"`
	CategoryID       uint           `json:"category_id"`
	CategoryName     string         `json:"category_name"`
	ResourceTypeName string         `json:"resource_type_name"`
	Tags             datatypes.JSON `gorm:"type:json" json:"tags"`

	TopicId    string `json:"topic_id"`
	TopicTitle string `json:"topic_title"`

	ViewCount    uint `json:"view_count"`
	LikeCount    uint `json:"like_count"`
	CollectCount uint `json:"collect_count"`

	Introduction string    `json:"introduction"`
	WebUrl       string    `json:"web_url"`
	MediaUrl     string    `json:"media_url"`
	ReleaseDate  time.Time `json:"release_date"`
	CreateBy     uint      `json:"create_by"`
	CreateTime   time.Time `json:"create_time"`
	UpdateBy     uint      `json:"update_by"`
	UpdateTime   time.Time `json:"update_time"`
	IsDeleted    int       `json:"is_deleted"`
}

// UserResourceResList 返回用户收藏资源数据结构体的列表结构体
type UserResourceResList struct {
	List        []UserResourceRes `json:"list"`
	Total       int64             `json:"total"`
	PageNum     int               `json:"pageNum"`
	PageSize    int               `json:"pageSize"`
	HasNextPage bool              `json:"hasNextPage"`
}

//*********** 修改用户信息 ***********

type UpdateUserRequestParam struct {
	Nickname     *string `json:"nickname,omitempty"`     // 用户昵称
	Avatar       *string `json:"avatar,omitempty"`       // 用户头像
	Email        *string `json:"email,omitempty"`        // 邮箱地址
	AccountType  *int8   `json:"accountType,omitempty"`  // 账号类型
	Username     *string `json:"username,omitempty"`     // 用户名
	Password     *string `json:"password,omitempty"`     // 密码
	PhoneNumber  *string `json:"phoneNumber,omitempty"`  // 手机号
	WechatOpenID *string `json:"wechatOpenid,omitempty"` // 微信OpenID
	QQOpenID     *string `json:"qqOpenid,omitempty"`     // QQ OpenID
	HuaweiID     *string `json:"huaweiId,omitempty"`     // 华为账号ID
	Status       *int8   `json:"status,omitempty"`       // 账号状态
}

type User struct {
	ID           uint64    `gorm:"primaryKey" json:"id"`
	Nickname     string    `gorm:"size:50;not null" json:"nickname"`
	Avatar       string    `gorm:"size:255" json:"avatar"`
	Email        string    `gorm:"size:100;unique" json:"email"`
	AccountType  int8      `gorm:"default:0" json:"accountType"`
	Username     string    `gorm:"size:50;unique" json:"username"`
	Password     string    `gorm:"size:255" json:"-"`
	PhoneNumber  string    `gorm:"size:20;unique" json:"phoneNumber"`
	WechatOpenID string    `gorm:"size:64;unique" json:"-"`
	QQOpenID     string    `gorm:"size:64;unique" json:"-"`
	HuaweiID     string    `gorm:"size:64;unique" json:"-"`
	Status       int8      `gorm:"default:1" json:"status"`
	LastLogin    time.Time `json:"lastLogin"`
	CreateTime   time.Time `gorm:"autoCreateTime" json:"createTime"`
	UpdateTime   time.Time `gorm:"autoUpdateTime" json:"updateTime"`
	IsDeleted    int8      `gorm:"default:0" json:"-"`
}

func (User) TableName() string {
	return "users"
}

type UserPassword struct {
	Password string `form:"password"`
}

//type SysUserUsersMeRes struct {
//	UserID   int64    `json:"userId"`   // 用户ID
//	Avatar   string   `json:"avatar"`   // 头像地址
//	Nickname string   `json:"nickname"` // 用户昵称
//	Perms    []string `json:"perms"`    // 用户权限标识集合
//	Roles    []string `json:"roles"`    // 用户角色编码集合
//}

//*********** 获取用户表单数据 ***********

// SysUserUsersFormSelect 定义用户表单查询结果的结构体
//type SysUserUsersFormSelect struct {
//
//	// 用户头像
//	Avatar string `gorm:"column:avatar" json:"avatar"`
//	// 部门ID
//	DeptID int64 `gorm:"column:dept_id" json:"deptId"`
//	// 邮箱
//	Email string `gorm:"column:email" json:"email"`
//	// 性别
//	Gender int8 `gorm:"column:gender" json:"gender"`
//	// 用户ID
//	ID     int64  `gorm:"column:id" json:"id"`
//	Mobile string `gorm:"column:mobile" json:"mobile"`
//	// 昵称
//	Nickname string `gorm:"column:nickname" json:"nickname"`
//
//	// 用户状态(1:正常;0:禁用)
//	Status int64 `gorm:"column:status" json:"status"`
//	// 用户名
//	Username string `gorm:"column:username" json:"username"`
//}

// SysUserUsersFormRes 定义用户表单响应结果的结构体
//type SysUserUsersFormRes struct {
//	// 用户头像
//	Avatar string `json:"avatar"`
//	// 部门ID
//	DeptID int64 `json:"deptId"`
//	// 邮箱
//	Email string `json:"email"`
//	// 性别
//	Gender int8 `json:"gender"`
//	// 用户ID
//	ID     int64  `json:"id"`
//	Mobile string `json:"mobile"`
//	// 昵称
//	Nickname string `json:"nickname"`
//	// 角色ID集合
//	RoleIDS []int64 `json:"roleIds"`
//	// 用户状态(1:正常;0:禁用)
//	Status int64 `json:"status"`
//	// 用户名
//	Username string `json:"username"`
//}

//*********** 获取用户列表 ***********

// SysUserUsersPageListParams 检索查询数据条件
//type SysUserUsersPageListParams struct {
//	DeptID    string `form:"deptId"`    // 部门ID
//	EndTime   string `form:"endTime"`   // 创建结束时间
//	Keywords  string `form:"keywords"`  // 关键字(用户名/昵称/手机号)
//	StartTime string `form:"startTime"` // 创建开始时间
//	Status    string `form:"status"`    // 用户状态
//}

// SysUserUsersListRedisKey 获取用户列表：Redis-key
//type SysUserUsersListRedisKey struct {
//	Query      SysUserUsersPageListParams
//	Pagination PaginationParams
//}

// SysUserUsersPageListSelect 分页的用户查询结果: 表Select
//type SysUserUsersPageListSelect struct {
//	Avatar      string `gorm:"column:avatar" json:"avatar"`          // 用户头像地址
//	CreateTime  string `gorm:"column:create_time" json:"createTime"` // 创建时间
//	DeptName    string `gorm:"column:dept_name" json:"deptName"`     // 部门名称
//	Email       string `gorm:"column:email" json:"email"`            // 用户邮箱
//	GenderLabel string `gorm:"-" json:"genderLabel"`                 // 性别
//	Gender      string `gorm:"column:gender" json:"gender"`          // 性别
//	ID          int64  `gorm:"column:id" json:"id"`                  // 用户ID
//	Mobile      string `gorm:"column:mobile" json:"mobile"`          // 手机号
//	Nickname    string `gorm:"column:nickname" json:"nickname"`      // 用户昵称
//	RoleNames   string `gorm:"column:role_names" json:"roleNames"`   // 角色名称，多个使用英文逗号(,)分割
//	Status      int64  `gorm:"column:status" json:"status"`          // 用户状态(1:启用;0:禁用)
//	Username    string `gorm:"column:username" json:"username"`      // 用户名
//}

// SysUserUsersPageListRes 用户分页列表响应结果
//type SysUserUsersPageListRes struct {
//	List     []SysUserUsersPageListSelect `json:"list"`
//	Total    int64                        `json:"total"`
//	PageNum  int                          `json:"pageNum"`
//	PageSize int                          `json:"pageSize"`
//}

//*********** 新增用户 ***********

// SysUserAddParams  添加用户表单对象
//type SysUserAddParams struct {
//	Avatar   string  `json:"avatar"`   // 用户头像
//	DeptID   int64   `json:"deptId"`   // 部门ID
//	Email    string  `json:"email"`    // 邮箱
//	Gender   int8    `json:"gender"`   // 性别
//	ID       int64   `json:"id"`       // 用户ID
//	Mobile   string  `json:"mobile"`   // 手机号
//	Nickname string  `json:"nickname"` // 昵称
//	RoleIDS  []int64 `json:"roleIds"`  // 角色ID集合
//	Status   int64   `json:"status"`   // 用户状态(1:正常;0:禁用)
//	Username string  `json:"username"` // 用户名
//}

// SysUserAddData username, nickname, gender, password, dept_id, mobile, status, email, create_time, update_time
//type SysUserAddData struct {
//	Avatar     string    `gorm:"column:avatar" json:"avatar"` // 用户头像
//	ID         int64     `gorm:"column:id;primaryKey;autoIncrement"`
//	Username   string    `gorm:"column:username"`
//	Nickname   string    `gorm:"column:nickname"`
//	Gender     int8      `gorm:"column:gender"`
//	DeptID     int64     `gorm:"column:dept_id"`
//	Mobile     string    `gorm:"column:mobile"`
//	Status     int       `gorm:"column:status"`
//	Email      string    `gorm:"column:email"`
//	Password   string    `gorm:"column:password"`
//	CreateTime time.Time `gorm:"column:create_time"`
//	UpdateTime time.Time `gorm:"column:update_time"`
//}

//*********** 修改用户 ***********

// SysUserEditParams  修改用户表单对象
//type SysUserEditParams struct {
//	Avatar   string  `json:"avatar"`   // 用户头像
//	DeptID   int64   `json:"deptId"`   // 部门ID
//	Email    string  `json:"email"`    // 邮箱
//	Gender   int8    `json:"gender"`   // 性别
//	Mobile   string  `json:"mobile"`   // 手机号
//	Nickname string  `json:"nickname"` // 昵称
//	RoleIDS  []int64 `json:"roleIds"`  // 角色ID集合
//	Status   int64   `json:"status"`   // 用户状态(1:正常;0:禁用)
//	Username string  `json:"username"` // 用户名
//}

// SysUserEditData username, nickname, gender, password, dept_id, mobile, status, email, create_time, update_time
//type SysUserEditData struct {
//	Avatar     string    `gorm:"column:avatar" json:"avatar"` // 用户头像
//	ID         int64     `gorm:"column:id;primaryKey;autoIncrement"`
//	Username   string    `gorm:"column:username"`
//	Nickname   string    `gorm:"column:nickname"`
//	Gender     int8      `gorm:"column:gender"`
//	DeptID     int64     `gorm:"column:dept_id"`
//	Mobile     string    `gorm:"column:mobile"`
//	Status     int       `gorm:"column:status"`
//	Email      string    `gorm:"column:email"`
//	Password   string    `gorm:"column:password"`
//	CreateTime time.Time `gorm:"column:create_time"`
//	UpdateTime time.Time `gorm:"column:update_time"`
//}

//*********** 删除用户 ***********

//type SysUserId struct {
//	ID int64 `gorm:"column:id;primaryKey;autoIncrement"`
//}

//*********** 删除用户 ***********
//
//type SysUserPassword struct {
//	Password string `form:"password"`
//}

//*********** 删除用户 ***********

//type SysUserStatus struct {
//	Status int64 `form:"status"`
//}

//*********** 获取个人中心用户信息 ***********

// UserProfile 个人中心用户信息
//type UserProfile struct {
//	// 头像URL
//	Avatar string `gorm:"column:avatar" json:"avatar"`
//	// 邮箱
//	Email string `gorm:"column:email" json:"email"`
//	// 性别
//	Gender int8 `gorm:"column:gender" json:"gender"`
//	// 用户ID
//	ID *int64 `gorm:"column:id" json:"id"`
//	// 手机号
//	Mobile string `gorm:"column:mobile" json:"mobile"`
//	// 用户昵称
//	Nickname string `gorm:"column:nickname" json:"nickname"`
//	// 用户名
//	Username string `gorm:"column:username" json:"username"`
//}
